#include <iostream>
#include <thread>
#include <queue>
#include <condition_variable>
#include <mutex>
#include <chrono>

std::queue<int> buffer; // 共享缓冲区
const unsigned int maxBufferSize = 5; // 缓冲区最大大小
std::mutex mtx; // 互斥量
std::condition_variable cv; // 条件变量

void producer() {
    for (int i = 0; i < 10; ++i) {
        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产时间
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [] { return buffer.size() < maxBufferSize; }); // 等待直到缓冲区有空间

        buffer.push(i); // 生产数据
        std::cout << "Produced: " << i << ", Buffer size: " << buffer.size() << std::endl;

        lock.unlock();
        cv.notify_one(); // 通知消费者
    }
}

void consumer() {
    for (int i = 0; i < 10; ++i) {
        std::this_thread::sleep_for(std::chrono::milliseconds(150)); // 模拟消费时间
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [] { return !buffer.empty(); }); // 等待直到缓冲区有数据

        int value = buffer.front(); // 消费数据
        buffer.pop();
        std::cout << "Consumed: " << value << ", Buffer size: " << buffer.size() << std::endl;

        lock.unlock();
        cv.notify_one(); // 通知生产者
    }
}

int main() {
    std::thread prod(producer);
    std::thread cons(consumer);

    prod.join();
    cons.join();

    return 0;
}
